/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package bs.tesoreria.web;

import bs.facturacion.web.*;
import bs.entidad.modelo.EntidadComercial;
import bs.entidad.web.BuscadorEntidadBean;
import bs.facturacion.modelo.CircuitoFacturacion;
import bs.facturacion.modelo.ItemProductoFacturacion;
import bs.facturacion.modelo.MovimientoFacturacion;
import bs.facturacion.rn.CircuitoFacturacionRN;
import bs.facturacion.rn.MovimientoFacturacionRN;
import bs.facturacion.vista.PendienteFacturacionDetalle;
import bs.facturacion.vista.PendienteFacturacionGrupo;
import bs.global.excepciones.ExcepcionGeneralSistema;
import bs.global.util.JsfUtil;
import bs.seguridad.web.UsuarioSession;
import bs.stock.modelo.Producto;
import bs.stock.web.BuscadorProductoBean;
import bs.tesoreria.modelo.MovimientoTesoreria;
import bs.tesoreria.rn.MovimientoTesoreriaRN;
import bs.ventas.rn.ListaPrecioRN;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.faces.bean.ManagedProperty;


/** 
 * @author ctrosch
 */
//@ManagedBean
//@ViewScoped
public class MovimientoTesoreriaBean implements Serializable {
    
    protected Logger log = Logger.getLogger(this.getClass().getName());

    protected @EJB MovimientoTesoreriaRN tesoreriaRN;
    protected @EJB CircuitoFacturacionRN circuitoRN;
    protected @EJB ListaPrecioRN  listaPrecioRN;

    protected String MODCJ = "";
    protected String CODCJ = "";
    
    protected boolean beanIniciado = false;

    //Datos para generar movimientos aplicados
    protected List<PendienteFacturacionGrupo> movimientosPendientes;
    protected List<PendienteFacturacionDetalle> itemsPendiente;
    protected PendienteFacturacionGrupo movimientoPendiente;
    
    protected boolean seleccionaTodo;
    protected boolean seleccionaPendiente;    
    protected boolean seleccionaComprobante;    
    
    protected Map<String,String> filtroGrupo;
    protected Map<String,String> filtroDetalle;
    private Date fDesde;
    private String nrocta; 

    @ManagedProperty(value = "#{usuarioSession}")
    protected UsuarioSession usuarioSession;

    @ManagedProperty(value = "#{buscadorProductoBean}")
    protected BuscadorProductoBean buscadorProductoBean;
    
    @ManagedProperty(value = "#{buscadorEntidadBean}")
    protected BuscadorEntidadBean buscadorEntidadBean;

    protected MovimientoTesoreria m;  
    protected CircuitoFacturacion circuito;    

    
    /** Creates a new instance of MovimientoFacturacion */
    public MovimientoTesoreriaBean() {

        movimientoPendiente = new PendienteFacturacionGrupo();
        itemsPendiente = new ArrayList<PendienteFacturacionDetalle>();
        filtroGrupo = new HashMap<String,String>();
        filtroDetalle = new HashMap<String,String>();
    }        
    
    public void iniciarVariables(String circom, String cirapl, String modfc, String codfc){
        
        if(!beanIniciado){
          
            MODCJ = modfc;
            CODCJ = codfc;
            
            iniciarMovimiento();    
            beanIniciado = true;
        }
    }
    
//  @PostConstruct
    public void iniciarMovimiento(){
                
        try {
            
            m = tesoreriaRN.nuevoMovimiento(MODCJ, CODCJ);                        
            
        } catch (Exception ex) {
            
            Logger.getLogger(MovimientoFacturacionBean.class.getName()).log(Level.SEVERE, null, ex);
            JsfUtil.addErrorMessage(ex.getMessage());
        }          
    }
        
    public void nuevoMovimiento(){
        
        
    }

    public void guardar(boolean  nuevo){

        try {
            // Primero sacamos de la lista el item vacio si es circuito de inicio
            tesoreriaRN.guardar(m);
            JsfUtil.addInfoMessage("El documento "+m.getFormulario().getDescripcion()+"-"+m.getNumeroFormulario()+" se guardó correctamente","");

            if(nuevo){
                nuevoMovimiento();
            }

        } catch (Exception ex) {            
            JsfUtil.addErrorMessage(ex.getMessage());
        }
    }

    public void agregarItem(ItemProductoFacturacion item){
        try {

            if(!puedoAgregarItem(item)) return;

            //calcularImportesLinea(item);
            //calcularImportes();
            item.setTodoOk(true);

            //Cargarmos un nuevo item en blanco
//            m.getItemsProducto().add((ItemProductoFacturacion) facturacionRN.nuevoItemProducto(m));
            
        } catch (Exception ex) {
            ex.printStackTrace();
            JsfUtil.addErrorMessage(ex.getMessage());
        }
    }

    public void eliminarItem(ItemProductoFacturacion nItem){

//        if(facturacionRN.eliminarItemProducto(m, nItem)){
//            calcularImportes();
//            JsfUtil.addWarningMessage("Se ha borrado el item "+ nItem.getProducto().getDescripcion()+ "");
//        }else{
//            JsfUtil.addWarningMessage("No se ha borrado el item "+ nItem.getProducto().getDescripcion() + "");
//        }
    }

    public boolean puedoAgregarItem(ItemProductoFacturacion nItem){

        if(nItem==null){
            JsfUtil.addErrorMessage("No se ha creado el item");
            return false;
        }

        if(nItem.getCantidad()==null || nItem.getCantidad().compareTo(BigDecimal.ZERO)<=0){
            JsfUtil.addErrorMessage("Ingrese un valor de cantidad válido. Mayor a 0");
            return false;
        }

        if(nItem.getProducto()==null){
            JsfUtil.addErrorMessage("Seleccione un producto para agregar al comprobante");
            return false;
        }

        return true;
    }
    
    public void actualizarCantidades(ItemProductoFacturacion item){
        
        actualizarAtributos(item);
    }

    /**
    * Actualizamos los atributos de stock, por el momento solo maneja nro de serie
    * @param item
    */
    public void actualizarAtributos(ItemProductoFacturacion item){

        //item.getItemDetalle().clear();
        //FC_ItemDetalle nuevoItemDetalle = facturacionRN.nuevoItemDetalle(item);
    }

    public void procesarCliente(){
        
        if(buscadorEntidadBean.getEntidad()!=null && m!=null){            
            
            EntidadComercial e = buscadorEntidadBean.getEntidad();
            
            m.setEntidadComercial(e); 
            m.setNombreEntidad(e.getRazonSocial());
            m.setCobrador(e.getCobrador());
        }
    }
    
    public void calcularImportes(){
        
    }
    
    
    public void imprimir(){

        try {
//            System.out.println("Nombre reporte " + m.getFormulario().getNombreReporte());
//
//            if (m.getFormulario().getNombreReporte()==null){
//                throw new ExcepcionGeneralSistema("El comprobante no tienen reporte asociado");
//            }
//
//            //JasperReport masterReport = (JasperReport) JRLoader.loadObject(getClass().getClassLoader().getResourceAsStream("/isd/produccion/reporte/"+ m.getFormulario().getNombreReporte()+".jasper"));
//            JasperReport masterReport = (JasperReport) JRLoader.loadObject(getClass().getClassLoader().getResourceAsStream( m.getFormulario().getNombreReporte()+".jasper"));
//
//            Map parameters = new HashMap();
//            parameters.put("MODFOR", m.getModfor());
//            parameters.put("CODFOR", m.getCodfor());
//            parameters.put("NROFOR", m.getNrofor());
//
//            empresaRN.cargarDatosEmpresa(parameters);
//
//            String nombreArchivo = m.getComprobante().getCodigo()+"-"+m.getNrofor();
//
//            ReportFactory reportFactory = new ReportFactory();
//            reportFactory.verReportePDF(masterReport, nombreArchivo, parameters);

        } catch (NullPointerException npe) {
            JsfUtil.addErrorMessage("No se encontró el archivo: " + m.getFormulario().getNombreReporte()+".jasper");
        } catch (Exception e){
            e.printStackTrace();
            JsfUtil.addErrorMessage("No se puede imprimir a pdf " + e.getMessage());
        }
    }

    
    //------------------------------------------------------------------------------------------------------------
    
    public String getMODCJ() {
        return MODCJ;
    }

    public void setMODCJ(String MODCJ) {
        this.MODCJ = MODCJ;
    }

    public String getCODCJ() {
        return CODCJ;
    }

    public void setCODCJ(String CODCJ) {
        this.CODCJ = CODCJ;
    }
    
    public BuscadorProductoBean getBuscadorProductoBean() {
        return buscadorProductoBean;
    }

    public void setBuscadorProductoBean(BuscadorProductoBean buscadorProductoBean) {
        this.buscadorProductoBean = buscadorProductoBean;
    }

    public CircuitoFacturacion getCircuito() {
        return circuito;
    }

    public void setCircuito(CircuitoFacturacion circuito) {
        this.circuito = circuito;
    }

    public Map<String, String> getFiltroDetalle() {
        return filtroDetalle;
    }

    public void setFiltroDetalle(Map<String, String> filtroDetalle) {
        this.filtroDetalle = filtroDetalle;
    }

    public Map<String, String> getFiltroGrupo() {
        return filtroGrupo;
    }

    public void setFiltroGrupo(Map<String, String> filtroGrupo) {
        this.filtroGrupo = filtroGrupo;
    }

    public List<PendienteFacturacionDetalle> getItemsPendiente() {
        return itemsPendiente;
    }

    public void setItemsPendiente(List<PendienteFacturacionDetalle> itemsPendiente) {
        this.itemsPendiente = itemsPendiente;
    }

    public MovimientoTesoreria getM() {
        return m;
    }

    public void setM(MovimientoTesoreria m) {
        this.m = m;
    }

    public PendienteFacturacionGrupo getMovimientoPendiente() {
        return movimientoPendiente;
    }

    public void setMovimientoPendiente(PendienteFacturacionGrupo movimientoPendiente) {
        this.movimientoPendiente = movimientoPendiente;
    }

    public List<PendienteFacturacionGrupo> getMovimientosPendientes() {
        return movimientosPendientes;
    }

    public void setMovimientosPendientes(List<PendienteFacturacionGrupo> movimientosPendientes) {
        this.movimientosPendientes = movimientosPendientes;
    }

    public boolean isSeleccionaTodo() {
        return seleccionaTodo;
    }

    public void setSeleccionaTodo(boolean seleccionarTodo) {
        this.seleccionaTodo = seleccionarTodo;
    }

    public UsuarioSession getUsuarioSession() {
        return usuarioSession;
    }

    public void setUsuarioSession(UsuarioSession usuarioSession) {
        this.usuarioSession = usuarioSession;
    }

    public BuscadorEntidadBean getBuscadorEntidadBean() {
        return buscadorEntidadBean;
    }

    public void setBuscadorEntidadBean(BuscadorEntidadBean buscadorEntidadBean) {
        this.buscadorEntidadBean = buscadorEntidadBean;
    }

    public boolean isSeleccionaPendiente() {
        return seleccionaPendiente;
    }

    public void setSeleccionaPendiente(boolean seleccionaPendiente) {
        this.seleccionaPendiente = seleccionaPendiente;
    }

    public boolean isSeleccionaComprobante() {
        return seleccionaComprobante;
    }

    public void setSeleccionaComprobante(boolean seleccionaComprobante) {
        this.seleccionaComprobante = seleccionaComprobante;
    }

    public Date getfDesde() {
        return fDesde;
    }

    public void setfDesde(Date fDesde) {
        this.fDesde = fDesde;
    }

    public String getNrocta() {
        return nrocta;
    }

    public void setNrocta(String nrocta) {
        this.nrocta = nrocta;
    }

    private void aplicarDatosPorDefecto() {
        //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
    
}
